\iffalse %% Copyright D.Love, SERC Daresbury Laboratory, 1991 %% The `doc' version of this style is re-distributable and usuable %% under conditions of the GNU copyleft, but please mark any changes, %% list them here and report any major enhancements to the author. % This is a self-documenting style. To produce the documentation you % might use a driver file like this: % \def\webmacs{null} \documentstyle[a4,makeidx,newdoc,web]{article} % \EnableCrossrefs \CodelineIndex % \begin{document} \DocInput{web.sty} \PrintIndex % \end{document} % and run `makeindex -s gind.ist doc' in between passes. You need % Mittelbach's newdoc.sty at v1.6d or later. % To produce the .sty file use `latex docstrip' to remove most of the % comments. Please don't distribute the .sty file without the .doc % file. \iffalse % hack RCS info into a sensible form: \def\next$#1: #2/#3/#4 #5 ${\def\filedate{#4/#3/#2}\def\filetime{#5}} \next$Date: 91/03/06 15:27:01 $ \def\next$#1: #2 ${\def\fileversion{#2}} \next$Revision: 1.3 $ % \title{A a \web{} style file for \LaTeX{}\thanks{This file is version % \fileversion\ of \filedate}} % \author{David Love\\[2ex]{\it SERC Daresbury Laboratory, Warrington % WA4 4AD, UK}\\ \tt d.love@daresbury.ac.uk} % \date{} % \newcommand{\web}{{\tt WEB}} % \newcommand{\weave}{{\tt WEAVE}} % \newcommand{\tangle}{{\tt tangle}} % \newcommand{\spider}{Spider} % \MakeShortVerb{\"} % \DoNotIndex{\/,\@date,\@ifundefined,\@makefnmark,\@starttoc} % \DoNotIndex{\@topnum,\addpenalty,addvspace,\advance,aftergroup} % \DoNotIndex{\begin,\begingroup,\bgroup,\char,\def,\egroup,\else,\end} % \DoNotIndex{\endgroup,\fi,\fnsymbol,\hfil,\hfill,\hfilneg,\hss,\kern} % \DoNotIndex{\let,\lineskip,\newcommand,\protect,\qquad,\quad,\relax} % \DoNotIndex{\thanks,\thefootnote,\z@,\@M,\@thanks,\@thefnmark,\hbox} % \DoNotIndex{\empty,\mbox} % \maketitle % \begin{abstract} \noindent % This style file is for use with a version of the Spidery \weave\ system % that has been adapted to use \LaTeX\ rather than plain \TeX\ for the % formatting. It is a first attempt. % \end{abstract} % \section{Assumptions of \weave{} and the {\tt .web} file} % We assume we're using the version of Spidery \weave{} \cite{spider} % changed for \LaTeX\@. This will write out % \begin{quote}"\def\webmacs{"\meta{ext}"web.tex}",\end{quote} % (where \meta{ext} is % the \spider{} {\tt extension}), then the limbo section, then % \begin{quote}"\begin{document}\maketitle" \end{quote} % the latter to stop you forgetting it. The "\webmacs" file will be % included at the end of this style. % After the index (if any), we get % "\end{document}". The user thus has to put the "\documentstyle" % command in the limbo part and include "web" in the style options to % get this stuff and can use other options as appropriate. You're % meant to use the "article" main style, although I think "report" % would work too. % \section{Strategy} % The idea was to change the original \spider{} \TeX{} stuff as little % as possible, although it has actually been changed quite % substantially. Changes are forced where there is a clash of macro % names; most of the original one-character control sequences are % already used by \LaTeX, for instance. Some features have been % converted to a \LaTeX{} equivalent, % notably the table of contents mechanism, the title page, running % header and double-columning for the index. For safety, "\def"s have % been replaced by "\newcommands" where possible since there are % probably plenty of possibilities for name clashes. % User-visible differences from the plain version are given in % appendix~\ref{changes}. % \section{Use with old webs} % Examples of the use of this style with old webs using the plain % conventions can be found in the accompanying changes files for % {\tt weave.web} and {\tt spider.web}. You can use the limbo section % to check whether the generated ".tex" file is being run through % \LaTeX\ or plain \TeX\ by doing something like this: % \begin{quote} % \begin{verbatim} % \ifx\enddocument\undefined % % plain things % \else % % LaTeX things % \fi % \end{verbatim} % \end{quote} % \section{Bugs} % Floats % don't always come out where you'd expect due to interaction with % \web's attempts to keep all of a module on one page if possible. % "\str" and "\vstr", which % might well get used in a moving argument, are % fragile. Module titles (after "@*") are moving arguments. I think % if you use \web's "|"\dots"|" construction in a % moving argument it will break and there's not much you can do about % it. % \section{Code} % \subsection{Preliminaries --- page layout} % Let's announce ourselves as usual: % \begin{macrocode} \typeout{Sub-style `web', version \fileversion\space of \filedate} % \end{macrocode} % We don't want stretch between paragraphs. % \begin{macrocode} \parskip \z@ % \end{macrocode} % \begin{macro}{\textwidth}\begin{macro}{\textheight} % \begin{macro}{\oddsidemargin} \begin{macro}{\evensidemargin} % The default page width should be large for \web\@. This is for % non-Americans (A4)---if you want to alter the page dimensions with a % suitable style option put it {\em after\/} "web" in the % "\documentstyle" list. The width here is too big for decently % readable text, but is % still less than the $6.5''$ of the original. Note that there's no % point in trying to use "\marginpar" at % this width since the margins have disappeared! The "twoside" option % will work sensibly if you care to use it.\DescribeMacro{twoside} We % want to avoid doing this when typesetting the documenttation, hence % the test for "\DocInput". % \begin{macrocode} \ifx\DocInput\undefined \ifcase \@ptsize \textheight = 53 \baselineskip \textheight = 47 \baselineskip \textheight = 43 \baselineskip \fi \advance \textheight by \topskip \textwidth=6.27in \oddsidemargin=\z@ \evensidemargin=\z@ % \end{macrocode} % \end{macro}\end{macro}\end{macro}\end{macro} % We use the "myheadings" page style with headings containing section % information (see below). % \begin{macrocode} \pagestyle{myheadings} % \end{macrocode} % If we start off with a "\sectionmark" we won't miss the running % header off the first page where it should appear. % \begin{macrocode} \ifx\DocInput\undefined \sectionmark{1} \fi % \end{macrocode} % \subsubsection{Font selection} % \begin{macro}{\normal@font} % We have to check whether we're in the old or new font selection scheme % and set up appropriately. "\normal@font" is invoked before the font % changes for identifiers, reserved words and strings to make sure % that they use the default series and shape in the new scheme. This % is actually only necessary if "\id", "\res" or "\str" is used in % \TeX\ text that is being set in a different shape or series, not % normally in the code. If you use the new selection scheme you can % do things like using Concrete or PostScript fonts easily. % \begin{macrocode} \@ifundefined{selectfont}{% \let\normal@font=\relax} % old scheme {% new scheme \def\normal@font{\series \mediumseriesdefault \shape \normalshapedefault}} % \end{macrocode} % \end{macro} % \subsection{Front matter} % We depart from the plain version here. The first page (or pages, if % the contents are very long) is produced with the "titlepage" % environment. The "\author", "\date" and % "\title" \DescribeMacro{\title} can be specified % as usual in \LaTeX\@. Note that you now say % "\title{"\meta{title}"}" rather than "\def\title{"\meta{title}"}" as % in the plain version and this title will be used in the running % header. % \begin{macro}{\@maketitle} % We'll re-define "\@maketitle" to include the "\topofcontents" and % "\botofcontents" information, with the contents information in the % middle. The normal title, author and date will be put automatically % at the top---"\topofcontents" is extra. You get the titling and % contents information automatically, since "\maketitle" is inserted % by \weave{} immediately after "\begin{document}". If you want to % suppress it, "\let\maketitle=\relax" in the limbo part. % Of course, you have to make two % passes to get the contents printed, unlike the original plain % system. This should not be much hardship as one usually reckons on % running \LaTeX{} at least twice. (Putting the titlepage at the back % won't help, since the ".toc" file only exists after the ".aux" file % has been read on the secind pass. One could change the standard % behaviour so that the ".toc" file was created at the end of the % first pass, I guess.) % We first test for "\DocInput" as above to % avoid messing things up when typesetting the documentation. % \begin{macrocode} \ifx\DocInput\undefined \def\@maketitle{% \newpage \thispagestyle{empty} \null \begin{center} {\LARGE \@title \par} \vskip 1.5em {\large \lineskip .5em \begin{tabular}[t]{c} \@author \end{tabular} \par} \vskip 1em {\large \@date} \end{center} \par \vskip 1.5em \topofcontents \tableofcontents \par \botofcontents \newpage } % \end{macrocode} % \end{macro} % \begin{macro}{\maketitle} % We change "\maketitle" to avoid the "\thispagestyle{plain}" that it % otherwise contains, to set the page number to 1 at the end and to % avoid losing the definitions of "\@title" and "\@author". % ("\@title" is used in the running header.) % \begin{macrocode} \ifx\DocInput\undefined \def\maketitle{% \par \begingroup \def\thefootnote{\fnsymbol{footnote}} \def\@makefnmark{\hbox to \z@ {$^{\@thefnmark}$\hss}} \if@twocolumn \twocolumn[\@maketitle] \else \newpage \global\@topnum\z@ \@maketitle \fi \@thanks \endgroup \setcounter{footnote}{0} \setcounter{page}{1} \let\maketitle\relax \let\@maketitle\relax \gdef\@thanks{}\let\thanks\relax} % \end{macrocode} % \end{macro} % \begin{macro}{\@title} \begin{macro}{\@author} % We better define these in case they're not supplied: % \begin{macrocode} \let\@title=\empty \let\@author=\empty % \end{macrocode} % \end{macro} \end{macro} % \begin{macro}{\tableofcontents} % "\tableofcontents" is re-defined to produce a header saying % ``Section'' and ``Page'' a bit like the plain version, although the % section number is at the left. % \begin{macrocode} \def\tableofcontents{% \noindent Section \hfill Page \par \@starttoc{toc}} % \end{macrocode} % \end{macro} % \begin{macro}{\topofcontents} \begin{macro}{\botofcontents} % The "\topofcontents" material that comes between the title\slash author % information and the contents list and the "\botofcontents" stuff % that comes after the contents list are empty initially. I'm not % sure it's worth preserving them. % \begin{macrocode} \def\topofcontents{} \def\botofcontents{} % \end{macrocode} % \end{macro} \end{macro} % \begin{macro}{\ttitlefont} \begin{macro}{\titlefont} % These are just for compatibility with the plain version---they % should probably go. % \begin{macrocode} \let\ttitlefont=\tt \let\titlefont=\rm % \end{macrocode} % \end{macro} \end{macro} % \subsection{Prettyprinting stuff} % \subsubsection{Identifiers, reserved words and strings} % \begin{macro}{\id}\begin{macro}{\ida}\begin{macro}{\idfont} % Multi-letter identifiers are set by the macro "\id" in font "\idfont", % which is italic by default i.e., \id{identifier}. % One-letter identifiers are % actually set by "\ida" in math italic as they are supposed to look % better that way (\ida{a} rather than \id{a}). % \begin{macrocode} \newcommand{\id}[1]{\mbox{\idfont #1\/\kern.05em}} \newcommand{\ida}[1]{\mbox{$ #1 $}} \newcommand{\idfont}{\normal@font \it} % \end{macrocode} % \end{macro} \end{macro} \end{macro} % \begin{macro}{\reservedfont}\begin{macro}{\res} % Reserved words are set by macro "\res", using "\reservedfont" which % is bold by default i.e., \res{reserved}. % \begin{macrocode} \newcommand{\reservedfont}{\normal@font \bf} \newcommand{\res}[1]{\mbox{\reservedfont#1\/}} % \end{macrocode} % \end{macro}\end{macro} % \begin{macro}{\str} % Typewriter type is used for strings, set by "\str" i.e., % \str{string}. The definitions of the escaped characters % are given below. I don't understand why the ampersand is treated % like this, since "\&" is defined anyway, but quotes and "^" are % escaped to avoid % ligatures.\footnote{{\tt \char`\^} and {\tt \char`\~} form ligatures % in PostScript virtual fonts as well as "'".} It's necessary to do a % "\def" of "\^" rather than just % "\let\^\CF" to avoid an error with the use of "\^" not matching its % definition. Note the use of "\@tempa" below rather than "\XX" as % used in the same situation elsewhere---using "\XX", "\str" breaks if % it is used in, say, a comment. % \begin{macrocode} \def\str#1{% \ifmmode \gdef\@tempa{\null$\null}\else \gdef\@tempa{}\fi \@tempa {% \let\\=\BS \let\'=\RQ \let\`=\LQ \let\{=\LB \let\}=\RB \let\~=\TL \let\ =\SP \let\&=\AM \def\^{{\tt \char`\^}}% \leavevmode \normal@font\tt #1}\@tempa} % \end{macrocode} % \end{macro} % \begin{macro}{\AM} \begin{macro}{\BS} \begin{macro}{\LB} % \begin{macro}{\LQ} \begin{macro}{\RB} \begin{macro}{\UL} % \begin{macro}{\TL} % Here are the definitions of the control sequences for strings. The % plain version redefined "\#", "\$", "\%" and "\^" globally. "\$" % isn't used by awk or C \web s, and has been removed. The others are % done only in code, using "\startcodehook" (below). % \begin{macrocode} \chardef\AM=`\& % ampersand \chardef\BS=`\\ % backslash \chardef\LB=`\{ % left brace \def\LQ{{\tt\char'22}} % left quote \chardef\RB=`\} % right brace \def\RQ{{\tt\char'23}} % right quote \def\UL{{\tt\char`\_}} % underline character in a string \def\TL{{\tt\char`\~}} % tilde % \end{macrocode} % \end{macro}\end{macro}\end{macro}\end{macro}\end{macro}\end{macro} % \end{macro} % \begin{macro}{\SP} % Strings may be rather long and we want some way of breaking % them, so % "\SP" produces a visible space (\str{\SP}) and also adds a discretionary % break afterwords. If a break occurs, the line is ended with a % backslash. Spaces are probably the most sensible place to break % strings, especially if they are messages, but one could consider % doing the same thing for other of the macros above e.g., "\BS" might % check if the next character was "n" and insert a discretionary break % after that. % \begin{macrocode} \newcommand{\SP}{\char`\ \discretionary{\hbox{\char`\\}}{}{}} % \end{macrocode} % \end{macro} % \begin{macro}{\vstr} % This does a verbatim string (from "@=") using the existing \LaTeX % nology rather than the original definition to put a frame around it % (\vstr{string}). % \begin{macrocode} \newcommand{\vstr}[1]{\kern 2pt \fbox{\str{#1}}\kern 2pt} \setlength{\fboxsep}{2pt} % \end{macrocode} % \end{macro} % \begin{macro}{\const} % This looks after setting octal, hex or decimal constants. The first % thing in its argument may be one of the control sequences in the % example on the left, % producing the result in the middle: % \[\begin{tabular}{lll} % "\const{\$10}" & $\const{\$10}$ & (long) \\ % "\const{\_10}" & $\const{\_10}$ & (power of ten)\\ % "\const{\~10}" & $\const{\~10}$ & (octal) \\ % "\const{\^AB10}" & $\const{\^AB10}$ & (hex) \\ % \end{tabular}\] % \DeleteShortVerb{\"} % \begin{macrocode} \def\const#1{{% \def\?{\kern.2em}% \def\${\ell}% long \def\_{\RealConstFormat{\aftergroup}}% power of ten \def\~{\hbox{\rm \char'23\kern-.2em \it \aftergroup\?\aftergroup}}% octal % \end{macrocode} % The \verb+"+ here was originally \verb+\char'175+ which, % unfortunately, is different in PostScript virtual fonts and Computer % Modern: % \begin{macrocode} \def\^{\hbox{\rm "\tt \aftergroup}}% hex #1}} % (\def{\const}) % \end{macrocode} % \end{macro} % \MakeShortVerb{\"} % \begin{macro}{\RealConstFormat} % I prefer to re-define the decimal style % to print as the more code-like `$\mbox{\rm e}10$'. You can % do this by using the hook "\RealConstFormat" in your Spider "macros" % section: % \begin{quote} "\newcommand{\RealConstFormat}{\mbox{\rm e}}" .\end{quote} % For a go at a Fortran web, I hacked the lexing so that an "e" or "d" in % a real or double-precision constant was transmitted verbatim into the % argument of "\const" instead of "\_" and re-defined "\const" to ensure % this was set in roman. % \begin{macrocode} \newcommand{\RealConstFormat}{\cdot 10^} % \end{macrocode} % \end{macro} % \subsubsection{Indentation and breaks} % \begin{macro}{\ind} % This counter stores the current indentation in ems. % \begin{macrocode} \newcount\ind % \end{macrocode} % \end{macro} % \begin{macro}{\bak} \begin{macro}{\bakk} % These backspace one and two ems respectively. % \begin{macrocode} \newbox\bak \setbox\bak=\hbox to \m@ne em{} \newbox\bakk \setbox\bakk=\hbox to -2em{} % \end{macrocode} % \end{macro}\end{macro} % \begin{macro}{\0} % A forced break, as from "@/": % \begin{macrocode} \def\0{% \ifmmode \ifinner$\par\hangindent\ind em\noindent\kern\ind em\ignorespaces$\fi \else \par\hangindent\ind em\noindent \kern\ind em\ignorespaces \fi} % \end{macrocode} % \end{macro} % \begin{macro}{\1} % Indent one more notch: % \begin{macrocode} \newcommand{\1}{\global\advance\ind by 1 \hangindent\ind em} % \end{macrocode} % \end{macro} % \begin{macro}{\2} % Indent one less notch: % \begin{macrocode} \newcommand{\2}{\global\advance\ind by \m@ne } % \end{macrocode} % \end{macro} % \begin{macro}{\3} % An optional break within a statement, as from "@|": % \begin{macrocode} \newcommand{\3}[1]{\hfil \penalty#10 \hfilneg} % \end{macrocode} % \end{macro} % \begin{macro}{\4} % Backspace one notch: % \begin{macrocode} \newcommand{\4}{\copy\bak} % \end{macrocode} % \end{macro} % \begin{macro}{\5} % Optional break: % \begin{macrocode} \newcommand{\5}{\hfil \penalty \m@ne \hfilneg \kern 2.5em \copy\bakk \ignorespaces} % \end{macrocode} % \end{macro} % \begin{macro}{\6} % A forced break with no indentation: % \begin{macrocode} \def\6{\ifmmode \else \par \hangindent\ind em\startline \ignorespaces \fi} % \end{macrocode} % \end{macro} % \begin{macro}{\startline} % This is used by "\code" as well as "\6" above. % \begin{macrocode} \def\startline{\noindent \count255=\ind \advance\count255 by -2 \hskip\count255 em} % \end{macrocode} % \end{macro} % \begin{macro}{\7} % A forced break and a little extra vertical space, as from "@#": % \begin{macrocode} \newcommand{\7}{\Y\6} % \end{macrocode} % \end{macro} % \begin{macro}{\8} % No indentation. It works only in code, not in "|"\dots"|". % \begin{macrocode} \newcommand{\8}{\unskip} % \end{macrocode} % \end{macro} % \begin{macro}{\J} % \tangle's join operation ("@&"): % \begin{macrocode} \newcommand{\J}{\str{@\&}} % \end{macrocode} % \end{macro} % \begin{macro}{\C} % This looks after comments. The hooks are inserted because comments % aren't code (see below). % \begin{macrocode} \def\C#1{\ifmmode\gdef\XX{\null$\null}\else\gdef\XX{}\fi \XX \hfil \penalty \m@ne\hfilneg\quad % original spider $\commentbegin\,$\endcodehook{#1}\startcodehook$\, \commentend$\XX} % \end{macrocode} % \end{macro} % \subsection{Modules} % \begin{macro}{\onmaybe} \begin{macro}{\maybe} \begin{macro}{\ifon} % These switches are concerned with only printing changed sections if % so desired. % \begin{macrocode} \def\onmaybe{\let\ifon=\maybe} \let\maybe=\iftrue \newif\ifon % \end{macrocode} % \end{macro}\end{macro}\end{macro} % \begin{macro}{\M} % Beginning of an un-starred section: % \begin{macrocode} \outer\def\M#1.{% \MN#1.\ifon\vfil\penalty-100\vfilneg \vskip12ptminus3pt \startsection \ignorespaces} % \end{macrocode} % \end{macro} % \begin{macro}{\startsection} \begin{macro}{\lapstar} % Some auxilliary definitions: % \begin{macrocode} \def\startsection{\Q \noindent {\let\*=\lapstar \bf \modstar.\quad }} \newcommand{\lapstar}{\rlap{*}} % \end{macrocode} % \end{macro} \end{macro} % \begin{macro}{\N} % This introduces a starred section (where "#2" is the title). We % have to check the title with "\headcheck" for a leading % character indicating a subsection. Then we write a contents entry, % change the running header and set the title in bold. "\old@S" is % used in the header rather than "\S" since "\S" is probably % wrongly-defined at this point (see below). % \begin{macrocode} \outer\def\N#1.#2.{% \MN#1.\headcheck#2\headcheck \typeout{*\modno} % progress report \addcontentsline{toc}{\headcheck@type} {\hbox to 2em{\modno\hfill} \quad \theopen \relax \themodtitle} \markboth{% running headline {\protect\small \qquad\uppercase{\ignorespaces\themodtitle}} \hfill {\protect\small \@title}\qquad{\rm \old@S \modno}} {\rm \old@S \modno\qquad {\protect\small \@title}\hfill {\protect\small \uppercase{\ignorespaces\themodtitle\qquad}}} \ifon\startsection {\bf \ignorespaces \themodtitle.\quad }\ignorespaces} % \end{macrocode} % \end{macro} % \begin{macro}{\MN} % Here is some common code for "\M" and "\N"\@. Like the normal \LaTeX{} % "\section", it looks after setting a % "\sectionmark" and advancing the section counter using % "\refstepcounter" so that it can be cross-referenced as usual. It % looks after the decision about whether or not to set this module if it % is not starred. % \begin{macrocode} \def\MN#1.{% \par {\xdef\modstar{#1}\let\*=\empty\xdef\modno{#1}}% \ifx\modno\modstar \onmaybe \else \ontrue \fi \sectionmark{\modno} \refstepcounter{section}} % \end{macrocode} % \end{macro} % \begin{macro}{\note} \begin{macro}{\A} % Auxilliary macros. "\A" is for cross-references for multiply % defined section names. % \begin{macrocode} \def\note#1#2.{\Y \noindent {\hangindent 2em \footnotesize \baselineskip 10pt#1 #2.\par}} \newcommand{\A}{\note{See also}} % \end{macrocode} % \end{macro} \end{macro} % \subsubsection{Processing special section headings} % This complicated stuff, introduced with \spider{} and modified for the % \LaTeX{} version, is to allow an inital =, 1, 2, 3 or 4 in % starred module titles to indicate a hierarchy. Their effect is as follows: % \[ \begin{tabular}{c|c|c} % Introduction & Page eject? & Indentation in contents\\ \hline % "@*=" & yes & 0 \\ % "@*1" & yes & 2 em \\ % "@*2" & no & 2 em \\ % "@*3" & yes & 4 em \\ % "@*4" & no & 4 em \\ % \end{tabular} \] % "@*=" also suppresses a following page eject and emboldens the % table of contents entry and puts some extra vertical space before % it. Normal starred sections have no indentation in the contents and % don't do anything special about page breaks. % \begin{macro}{\l@part} \begin{macro}{\l@norm} \begin{macro}{\l@num} % Two new sorts of contents entry are defined here and the `part' % type re-defined. (See "latex.tex" for details of how this works.) % "\l@part" determines the t.o.c.\ entry for a "@*=" section, % "\l@norm" the entry for a normal starred section and "\l@num" that % for a numbered section. Some penalties are inserted (the normal % values for the main style) in case the t.o.c.\ extends over more % than one page. The "\headcheck@type" definition is used in the % sectioning commands to write the t.o.c.\ entry. % \begin{macrocode} \def\l@part{\addpenalty{\@secpenalty} \addvspace{3pt plus 1pt} % space above part line \@dottedtocline{0}{\z@ }{4em}} \def\l@norm{\addpenalty{\@secpenalty} \@dottedtocline{0}{\z@ }{4em}} \def\l@num{\@dottedtocline{0}{0em}{4em}} % \end{macrocode} % \end{macro}\end{macro}\end{macro} % \begin{macro}{\ifcancel} \begin{macro}{\ifnextchar} % \begin{macro}{\ifnch} \begin{macro}{\makethechar} % Here's the tricky stuff, presented without further comment! % \begin{macrocode} \newif\ifcancel \cancelfalse \def\ifnextchar#1#2#3{% \let\@tempe=#1\def\@tempa{#2}\def\@tempb{#3}\@ifnch} \def\@ifnch{% \ifx \@tempc \@tempe\let\@tempd\@tempa \else \let\@tempd\@tempb \fi \@tempd} \def\makethechar#1{\let\@tempc=#1} % \end{macrocode} % \end{macro} \end{macro} \end{macro} \end{macro} % \begin{macro}{\headcheck} % \begin{macrocode} \def\headcheck#1#2\headcheck{% \makethechar{#1}% \def\theskipper{\vfil\penalty-100 % skip before new module \vfilneg\vskip12ptminus3pt}% \def\theopen{}% opening skip in toc entry \def\thetocskip{}% vertical skip before toc entry \def\themodtitle{{#2}}% \def\headcheck@type{num}% \ifnextchar={% \def\theskipper{\newpage} \canceltrue \def\headcheck@type{part} \def\theopen{\bf}% \def\thetocskip{\vskip 3pt plus 1in \penalty-100 \vskip \z@ plus -1in}% }{\ifnextchar1{% \cancelfalse \def\theskipper{\newpage}% \def\theopen{\hskip2em}% }{\ifnextchar2{% \cancelfalse \def\theopen{\hskip2em}% }{\ifnextchar3{% \cancelfalse \def\theskipper{\newpage}% \def\theopen{\hskip4em}% }{\ifnextchar4{% \cancelfalse \def\theopen{\hskip4em}% }{% else \ifcancel\else \def\theskipper{\newpage}\fi \cancelfalse \def\headcheck@type{norm}% \def\themodtitle{#1{#2}}% }}}}}% \theskipper } % \end{macrocode} % \end{macro} % \subsubsection{Starting and ending code sections} % \begin{macro}{\code} % This takes us into code mode. The old version used infinite hyphen % penalty which stopped the discretionary breaks in strings. Extra % space is put after ";" with the "\sfcode". % \begin{macrocode} \newcommand{\code}{% \rightskip=\z@ plus 100pt minus 10pt \sfcode`;=3000 \pretolerance \@M \hyphenpenalty 9999 \exhyphenpenalty \@M \global\ind=2 \1 \startline % \end{macrocode} % \DescribeMacro{\@} % The original says that every web must define "\?", where "?" is the % at-sign. Since "\@" is used for end-of-sentence space in \LaTeX, we % make sure this is only done in code mode. We need the old and new % definitions, "\old@" and "\code@", between which to switch. % \spider{} unfortunately uses "\S" instead of "\equiv" and the awk % and C \web s assume that "\%" and "\#" translate to typewriter % versions, so we have to define these properly in code mode too. % \DescribeMacro{\startcodehook} \DescribeMacro{\endcodehook} % For convenience, we define token registers % "\startcodehook" and "\endcodehook" for this sort of purpose when we % go into and out of code mode. These might be altered by the % \spider\ description if appropriate. % \begin{macrocode} \startcodehook} % \def\code % \end{macrocode} % \end{macro} % \begin{macro}{\old@}\begin{macro}{\code@}\begin{macro}{\old@S} % \begin{macro}{\old@percent} \begin{macro}{\old@hash} % Let's store the original definitions of these: % \begin{macrocode} \let\old@=\@ \let\old@S=\S \let\old@percent=\% \let\old@hash=\# % \end{macrocode} % \end{macro}\end{macro}\end{macro}\end{macro}\end{macro} % \begin{macro}{\code@}\begin{macro}{\tt@percent}\begin{macro}{\tt@hash} % And here are replacements for use in code mode. % \begin{macrocode} \chardef\code@=`\@ \def\tt@percent{\hbox{\tt\char`\%}} \def\tt@hash{\hbox{\tt\char`\#}} % \end{macrocode} % \end{macro}\end{macro}\end{macro} % \begin{macro}{\startcodehook}\begin{macro}{\endcodehook} % Here are the hooks. Should these be token registers? % \begin{macrocode} \def\startcodehook{\let\@=\code@ \let\S=\equiv \let\%=\tt@percent \let\#=\tt@hash \def\^{\hbox{\tt\char`\^}}} \def\endcodehook{\let\@=\old@ \let\S=\old@S \let\%=\old@percent \let\#=\old@hash \def\^##1{{\accent94 ##1}}} % \end{macrocode} % \end{macro}\end{macro} % \begin{macro}{\Q} % This gets us out of code mode, setting things back to normal. % \begin{macrocode} \def\Q{\rightskip=\z@ \sfcode`;=1500 \pretolerance 200 \endcodehook} % \end{macrocode} % \end{macro} % \begin{macro}{\CD} \begin{macro}{\DC} % Web text in "|"\dots"|" is woven into text surrounded by % "\CD"\dots"\DC"\@. The original definition didn't bother with the % grouping if not in math mode, but it's convenient now that the hooks % need to be added. % \begin{macrocode} \def\DC{\endcodehook \egroup} \def\CD{\relax \ifmmode \hbox\fi \bgroup \startcodehook} % \end{macrocode} % \end{macro}\end{macro} % \begin{macro}{\U} % This provides a cross-reference for uses of sections. % \begin{macrocode} \newcommand{\U}{\note{This code is used in}} % \end{macrocode} % \end{macro} % \begin{macro}{\X} % This does modules which introduce the code. Note the usage: % "\X"\meta{module number}":"\meta{module name}"\X". % \begin{macrocode} \def\X#1:#2\X{% \ifmmode \gdef\XX{\null$\null}\else \gdef\XX{}\fi \XX$\langle\,$#2{\footnotesize \kern.5em #1}$\,\rangle$\XX } % \end{macrocode} % \end{macro} % \begin{macro}{\XF} % This is for a file module (from "@("): % \begin{macrocode} \def\XF#1:#2\XF{% \ifmmode \gdef\XX{\null$\null}\else \gdef\XX{}\fi \XX {\tt (#2{\footnotesize \kern.5em #1})}\XX} % \end{macrocode} % \end{macro} % \begin{macro}{\Y} \begin{macro}{\yskip} % This does a vertical skip by "\yskip", used in "\note" and "\7". % \begin{macrocode} \newcommand{\Y}{\par\yskip} \let\yskip=\smallskip % \end{macrocode} % \end{macro}\end{macro} % % \subsection{Definitions and formats} % \begin{macro}{\D} \begin{macro}{\F} \begin{macro}{\defin} % "\D" and "\F" deal with macro and format definitions from "@d" and % "@f" respectively. % \begin{macrocode} \newcommand{\D}{\defin{define}} % macro definition \newcommand{\F}{\defin{format}} % format definition \newcommand{\defin}[1]{\global\advance\ind by 2 \1\res{#1 }} % \end{macrocode} % \end{macro}\end{macro}\end{macro} % \subsection{Miscellaneous symbols} % \begin{macro}{\DO} \begin{macro}{\G} \begin{macro}{\I} % \begin{macro}{\K} \begin{macro}{\L} \begin{macro}{\R} % \begin{macro}{\TI} \begin{macro}{\V} \begin{macro}{\W} % Here are some miscellaneous symbols. I think these should really be % defined in the \spider\ descriptions that need them, but they are % assumed by the current webs. % \begin{macrocode} \newcommand{\DO}{\hbox{\sl\char'044}} % slant dollar sign (used by awkweb) \let\G=\ge % greater than or equal sign \let\I=\ne % unequal sign \let\K=\gets % left arrow \let\L=\le % less than or equal sign \let\R=\lnot % logical not \let\TI=\sim % tilde \let\V=\lor % logical or \let\W=\land % logical and % \end{macrocode} % \end{macro}\end{macro}\end{macro}\end{macro}\end{macro}\end{macro} % \end{macro}\end{macro}\end{macro} % \begin{macro}{\vert} \begin{macro}{\amp} \begin{macro}{\PP} % \begin{macro}{\*} % And some more: (n.b., the plain \TeX{} definitions of "\vert" % and "\*" are over-written, as expected by spidery \weave---maybe this % should be changed). % \begin{macrocode} \def\vert{|} \let\amp=\& \let\PP=\P \let\*=* % \end{macrocode} % \end{macro}\end{macro}\end{macro}\end{macro} % \begin{macro}{\AT} % This is the `at sign in control % text'. In the plain version it says "\def\AT!{@}" which I presume % is a mistake. % \begin{macrocode} \def\AT{@} % \end{macrocode} % \end{macro} % \subsection{Indexing} % \begin{macro}{\ch} % This is used trivially at the start of the index in the case of % changes: % \begin{macrocode} \def\ch{\note{The following sections were changed by the change file:} \let\*=\relax} % \end{macrocode} % \end{macro} % \begin{macro}{\inx} \begin{macro}{\:} % The index is set in two-column mode. % Each item in each index is introduced by "\:". This is a \LaTeX{} % macro but is unlikely to get used in the index and so is preserved % from the original. % \begin{macrocode} \def\inx{% \typeout{Index:} \begin{multicols}{2} \parskip \z@ plus .5pt \parfillskip \z@ plus .6\hsize % try to avoid almost empty lines \outer\def\:##1, {\par\hangindent2em\noindent##1:\kern1em} % index entry \rm \tolerance \@M \let\*=\lapstar \hyphenpenalty \@M \parindent=\z@ } % \end{macrocode} % \end{macro}\end{macro} % \begin{macro}{\fin} % This finishes off the name index and starts off the module index. % "\:" acts as in "\inx". The modules may be % qualified with "\U", which cross-references section uses. The page % header is changed appropriately. % \begin{macrocode} \def\fin{% \end{multicols} \newpage \parfillskip \z@ plus 1fil \markboth{{\protect\small NAMES OF THE SECTIONS}\hfill {\protect\small\@title}} {{\protect\small\@title}\hfill {\protect\small NAMES OF THE SECTIONS}} \typeout{Section names:} \def\note##1##2.{\quad{\footnotesize##1 ##2.}} \def\U{\note{Used in}}% \def\:{\par\hangindent 2em}\let\*=*} % \end{macrocode} % \end{macro} % \begin{macro}{\con} % This finishes everything off, rather trivially. (It used to make % the contents page.) % \begin{macrocode} \newcommand{\con}{\end{document}} % \end{macrocode} % \end{macro} % \subsection{Including other files} % \DescribeEnv{multicols} % We need the {\tt multicols} environment to make a two-column index % without a forced page break. % \begin{macrocode} \input{multicol.sty} % \end{macrocode} % \DescribeMacro{\webmacs} % Finally we include the macros defined by \spider. Doing things this way % means that \spider{} can override things done in this file for the % \web{} system of a particular language (like the % definition of "\res", for instance) and the limbo section can do % further overriding for a particular web file. If we're using this % file to document itself, "\webmacs" should have been defined in the % driver file to be "null"! % \begin{macrocode} \input{\webmacs} % \end{macrocode} % "\webmacs" is no further use and we might as well save the space. % \begin{macrocode} \let\webmacs=\empty % \end{macrocode} % \appendix % \section{Changes from the plain version}\label{changes} % \begin{description} % \item[{\tt \BS.}] becomes "\str"; % \item[{\tt \BS\char`\^}] has been removed from the global % definitions (where it was assumed by the "c.spider" translation for % "^") and put in limbo in "weave.ch"; % \item[{\tt \BS\%}, {\tt \BS\#} and {\tt \BS\$}] also removed from global % definitions and put in "\startcodehook"; % \item[{\tt \BS AT!}] becomes "\AT" on the assumption that % the original was an error; % \item[{\tt \BS\char`\~}] removed globally since it doesn't seem to be used; % \item[{\tt \BS\BS} and {\tt \BS|}] become "\id" and "\ida" respectively; % \item[{\tt \BS\&}] becomes "\res"; % \item[{\tt \BS B} and {\tt \BS T}] (for controlled comments) removed % since no controlled comments in \spider; % \item[{\tt \BS)}] (string pool check sum) removed; % \item[{\tt \BS]}] (sign for forced line break) appears not be be % used, so removed; % \item[{\tt \BS=}] becomes "\vstr"; % \item[{\tt \BS H}] (hat) removed since it seems not to be used and % clashes with \LaTeX; % \item[{\tt \BS Z}] replaced by \LaTeX{} contents stuff; % \item[{\tt \BS lheader} and {\tt \BS rheader}] replaced by \LaTeX{} marks; % \item[output routine stuff] all gone; % \item[{\tt \BS rhead}] no longer relevant---use the \LaTeX{} mark % mechanism; % \item[{\tt \BS title}] should be called as a macro with the title as % its argument rather than "\def"ed; % \item[{\tt \BS contentspagenumber}, {\tt \BS contentsfile} and {\tt % \BS readcontents}] no longer relevant; % \item[{\tt \BS pagewidth}, {\tt \BS pageheight} and {\tt \BS % fullpageheight}] no longer relevant---use the \LaTeX\ equivalents; % \item[{\tt \BS pageshift}] no longer relevant---use "twoside" option; % \item[verbatim macros] no longer relevant; % \item[{\tt \BS iftitle}] removed---use "\pagestyle{empty}" to % suppress page header. % \end{description} % \begin{thebibliography}{1} % \bibitem{spider} N. Ramsey, {\sl Comm. ACM}, {\bf 32} (1989) 1051 % \end{thebibliography}